import module.logger as logger
import ctypes
import winreg


"""
windows下根据系统夜间模式开启状态自动设置深色模式或浅色模式
"""

log = logger.get_logger()


def set_windows_theme(mode):
    """
    设置Windows系统的深色/浅色模式，支持即时生效
    mode: "Dark" 或 "Light"
    """
    try:
        # 注册表路径（系统和应用主题的控制键）
        key_path = r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"

        # 打开注册表项（允许写入）
        with winreg.OpenKey(
            winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_WRITE
        ) as key:
            # 设置值（0=深色，1=浅色）
            value = 0 if mode == "Dark" else 1

            # 修改应用主题（影响资源管理器等应用）
            winreg.SetValueEx(key, "AppsUseLightTheme", 0, winreg.REG_DWORD, value)
            # 修改系统主题（影响任务栏、开始菜单等系统组件）
            winreg.SetValueEx(key, "SystemUsesLightTheme", 0, winreg.REG_DWORD, value)

        # 发送系统通知，让设置立即生效
        ctypes.windll.user32.SendMessageTimeoutW(
            0xFFFF,  # 广播到所有窗口
            0x001A,  # WM_SETTINGCHANGE 消息
            0,
            "ImmersiveColorSet",  # 通知主题颜色变化
            0x0002,  # SMTO_ABORTIFHUNG 标志
            5000,  # 超时时间（毫秒）
            None,
        )

        log.info(f"已成功切换到【{mode}】模式")

    except Exception as e:
        log.error(f"操作失败：{str(e)}")


def read_blue_light_registry_data():
    ### 读取夜间模式注册表数据
    # 定义注册表路径
    reg_path = r"Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate"

    try:
        # 打开注册表项（HKEY_CURRENT_USER）
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path, 0, winreg.KEY_READ)

        try:
            # 读取Data值（二进制数据）
            # 参数说明：键名、保留值（0）、数据类型（这里自动识别）
            data, reg_type = winreg.QueryValueEx(key, "Data")

            # 验证数据类型是否为二进制
            if reg_type == winreg.REG_BINARY:
                log.info("成功读取当前夜间模式注册表数据")
                # 以十六进制格式展示数据
                hex_data = " ".join(f"{byte:02X}" for byte in data)
                flag = hex_data.split(" ")[18]
                if flag == "15":
                    log.info("夜间模式状态变更为【开启】")
                    return True
                elif flag == "13":
                    log.info("夜间模式状态变更为【关闭】")
                    return False
                elif flag == "12":
                    log.info("根据指定时间自动变更夜间模式状态为【开启】")
                    return True
                elif flag == "10":
                    log.info("根据指定时间自动变更夜间模式状态为【关闭】")
                    return False
                else:
                    log.warning(f"当前夜间模式状态未知：【{flag}】")
                    return None
            else:
                log.error(f"Data值不是二进制类型，实际类型：{reg_type}")
                return None

        finally:
            # 关闭注册表项
            winreg.CloseKey(key)

    except FileNotFoundError:
        log.error(f"注册表路径不存在：{reg_path}")
        return None
    except Exception as e:
        log.error(f"读取失败：{str(e)}")
        return None


def get_windows_theme_mode():
    """
    获取Windows系统的主题模式（深色/浅色）

    返回值:
        str: "dark" 表示深色模式, "light" 表示浅色模式, None 表示未知状态
    """
    try:
        # 打开注册表项
        with winreg.OpenKey(
            winreg.HKEY_CURRENT_USER,
            r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize",
            0,
            winreg.KEY_READ,
        ) as reg_key:
            # 读取SystemUsesLightTheme值
            # 0表示深色模式，1表示浅色模式
            value, _ = winreg.QueryValueEx(reg_key, "SystemUsesLightTheme")

            return "dark" if value == 0 else "light"
    except FileNotFoundError:
        log.error("未找到主题设置注册表项")
    except Exception as e:
        log.error(f"获取主题模式时出错: {e}")

    return None


def main():
    log.info("夜间模式状态发生改变，设置系统深色/浅色模式")
    dark_flag = read_blue_light_registry_data()
    if dark_flag != None:
        current_dark_flag = get_windows_theme_mode()
        if dark_flag:
            if current_dark_flag == "dark":
                log.info("当前主题模式为深色，无需更改")
            else:
                log.info("设置系统深色模式")
                set_windows_theme("Dark")
        else:
            if current_dark_flag == "light":
                log.info("当前主题模式为浅色，无需更改")
            else:
                log.info("设置系统浅色模式")
                set_windows_theme("Light")
    log.info("=" * 50)


# 只在直接运行本脚本时才会执行，如何作为模块被引入是不会执行的
if __name__ == "__main__":
    main()
